package com.mihuxiaobaigao.ai.utils;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * 图片处理工具类
 * 功能：图片格式转换、存储、类型判断
 */
public class ImageProcessingUtils {

    // 支持的图片格式
    private static final Set<String> SUPPORTED_FORMATS = new HashSet<>(
            Arrays.asList("jpg", "jpeg", "png", "gif", "bmp", "webp")
    );

    // 透明背景格式（需要特殊处理）
    private static final Set<String> TRANSPARENT_FORMATS = new HashSet<>(
            Arrays.asList("png", "gif")
    );

    /**
     * 处理并保存图片（总方法）
     * @param imageFile 前端上传的图片文件
     * @param itemName 物品名称
     * @param outputPath 存储根路径
     * @return 存储后的完整文件路径
     * @throws IOException 文件操作异常
     * @throws IllegalArgumentException 不支持的格式或参数错误
     */
    public static String processAndSaveImage(MultipartFile imageFile, String itemName, String outputPath)
            throws IOException, IllegalArgumentException {

        // 参数校验
        validateParameters(imageFile, itemName, outputPath);

        // 获取文件原始信息
        String originalFilename = imageFile.getOriginalFilename();
        String fileExtension = getFileExtension(originalFilename);

        // 检查是否支持该格式
        if (!isSupportedFormat(fileExtension)) {
            throw new IllegalArgumentException("不支持的图片格式: " + fileExtension);
        }

        // 创建存储目录
        createOutputDirectory(outputPath);

        // 生成最终文件名和路径
        String finalFilename = generateFinalFilename(itemName);
        String fullPath = outputPath + File.separator + finalFilename;

        // 根据不同类型进行转换处理
        BufferedImage bufferedImage;
        try {
            if (isTransparentFormat(fileExtension)) {
                // 透明背景格式需要特殊处理
                bufferedImage = convertTransparentImage(imageFile, fileExtension);
            } else {
                // 普通格式直接转换
                bufferedImage = convertOpaqueImage(imageFile, fileExtension);
            }

            // 保存为JPG格式
            saveAsJpg(bufferedImage, fullPath);

        } catch (Exception e) {
            throw new IOException("图片转换失败: " + e.getMessage(), e);
        }

        return fullPath;
    }

    /**
     * 参数验证
     */
    private static void validateParameters(MultipartFile imageFile, String itemName, String outputPath) {
        if (imageFile == null || imageFile.isEmpty()) {
            throw new IllegalArgumentException("图片文件不能为空");
        }
        if (itemName == null || itemName.trim().isEmpty()) {
            throw new IllegalArgumentException("物品名称不能为空");
        }
        if (outputPath == null || outputPath.trim().isEmpty()) {
            throw new IllegalArgumentException("存储路径不能为空");
        }
    }

    /**
     * 获取文件扩展名
     */
    private static String getFileExtension(String filename) {
        if (filename == null || filename.lastIndexOf(".") == -1) {
            throw new IllegalArgumentException("文件名不合法: " + filename);
        }
        return filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
    }

    /**
     * 检查是否支持该格式
     */
    private static boolean isSupportedFormat(String extension) {
        return SUPPORTED_FORMATS.contains(extension.toLowerCase());
    }

    /**
     * 检查是否为透明背景格式
     */
    private static boolean isTransparentFormat(String extension) {
        return TRANSPARENT_FORMATS.contains(extension.toLowerCase());
    }

    /**
     * 创建输出目录
     */
    private static void createOutputDirectory(String outputPath) throws IOException {
        File directory = new File(outputPath);
        if (!directory.exists()) {
            if (!directory.mkdirs()) {
                throw new IOException("无法创建目录: " + outputPath);
            }
        }
        if (!directory.canWrite()) {
            throw new IOException("目录不可写: " + outputPath);
        }
    }

    /**
     * 生成最终文件名
     */
    private static String generateFinalFilename(String itemName) {
        // 清理文件名中的非法字符
        String safeName = itemName.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5-_]", "_");
        return safeName + ".jpg";
    }

    /**
     * 转换透明背景图片（PNG, GIF等）
     */
    private static BufferedImage convertTransparentImage(MultipartFile imageFile, String originalFormat)
            throws IOException {
        BufferedImage originalImage = ImageIO.read(imageFile.getInputStream());
        if (originalImage == null) {
            throw new IOException("无法读取图片文件，可能不是有效的图片格式");
        }

        // 创建新的RGB图像（白色背景）
        BufferedImage newImage = new BufferedImage(
                originalImage.getWidth(),
                originalImage.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );

        // 用白色填充背景
        Graphics2D g = newImage.createGraphics();
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, originalImage.getWidth(), originalImage.getHeight());

        // 绘制原始图像
        g.drawImage(originalImage, 0, 0, null);
        g.dispose();

        return newImage;
    }

    /**
     * 转换不透明背景图片（JPG, BMP等）
     */
    private static BufferedImage convertOpaqueImage(MultipartFile imageFile, String originalFormat)
            throws IOException {
        BufferedImage originalImage = ImageIO.read(imageFile.getInputStream());
        if (originalImage == null) {
            throw new IOException("无法读取图片文件，可能不是有效的图片格式");
        }

        // 如果已经是JPG格式，直接返回
        if ("jpg".equalsIgnoreCase(originalFormat) || "jpeg".equalsIgnoreCase(originalFormat)) {
            return originalImage;
        }

        // 转换为RGB格式（确保兼容性）
        BufferedImage newImage = new BufferedImage(
                originalImage.getWidth(),
                originalImage.getHeight(),
                BufferedImage.TYPE_INT_RGB
        );

        Graphics2D g = newImage.createGraphics();
        g.drawImage(originalImage, 0, 0, null);
        g.dispose();

        return newImage;
    }

    /**
     * 保存为JPG格式
     */
    private static void saveAsJpg(BufferedImage image, String filePath) throws IOException {
        File outputFile = new File(filePath);

        // 设置JPG压缩质量
        ImageIO.write(image, "jpg", outputFile);
    }

    /**
     * 获取图片信息（可选功能）
     */
    public static String getImageInfo(MultipartFile imageFile) throws IOException {
        BufferedImage image = ImageIO.read(imageFile.getInputStream());
        if (image == null) {
            return "无法读取图片信息";
        }

        return String.format("尺寸: %dx%d, 类型: %s",
                image.getWidth(), image.getHeight(),
                image.getColorModel().getPixelSize() + "位");
    }
}
